// 需求: es6模块化，用async、await和then-fs模块实现操作文件数据
//     功能:  增删改查;
// 导入对应模块
import { thenFs } from './index.js'
// ES6中不支持 __dirname ,所以当前这个案例还是使用相对路径;
const url = './data/sim_mobile_code/data.json'

const contenturl = './data/invitation_code/index.json'

const reportCardurl = './data/report_card/index.json'

//一. sim 手机号 get
export async function getData() {
  try {
    // 利用 thenFs 读取文件内容
    const str = await thenFs.readFile(url, 'utf-8') // 返回的是Promise
    // 把str转换为数组
    const arr = JSON.parse(str)
    // 返回数组, 将来别人调用这个函数，就可以获取数组了
    return arr
  } catch (e) {
    return '获取卡号列表失败'
  }
}

//一. sim 手机号 post
export async function addData(obj) {
  // 先读取文件中的数据
  const arr = await getData()

  // 添加当前时间
  obj.sim_time = new Intl.DateTimeFormat('en-US', {
    timeZone: 'Asia/Shanghai',
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    fractionalSecondDigits: 3
  }).format(new Date())

  const newObj = {}
  for (const key in obj) {
    if (key !== 'id') {
      newObj[key] = obj[key]
    }
  }

  newObj.id = arr[arr.length - 1].id * 1 + 1
  // 然后向数组中添加元素
  //   obj.id = arr[arr.length - 1].id * 1 + 1;
  arr.push(newObj)
  // 写入数据
  try {
    // 代码 thenFs.writeFile()之前最好写await，有阻塞功能;
    await thenFs.writeFile(url, JSON.stringify(arr))

    return '添加成功'
  } catch (e) {
    return '添加失败'
  }
}

//一. sim 手机号 delete
export async function delData(id) {
  // 先读取文件中的数据
  const arr = await getData()
  // 过滤模拟删除功能
  const newArr = arr.filter(item => item.id != id)
  // 写入文件
  try {
    // 代码 thenFs.writeFile()之前最好写await，有阻塞功能;
    await thenFs.writeFile(url, JSON.stringify(newArr))
    return '删除成功'
  } catch (e) {
    return '删除失败'
  }
}

//一. sim 手机号 put
export async function putData(obj) {
  // 先读取文件中的数据
  const arr = await getData()
  // 修改 - 先删除，在添加
  const index = arr.findIndex(item => item.id == obj.id)
  arr.splice(index, 1, obj)
  // 写入数据
  try {
    // 代码 thenFs.writeFile()之前最好写await，有阻塞功能;
    await thenFs.writeFile(url, JSON.stringify(arr))
    return '修改成功'
  } catch (e) {
    return '修改失败'
  }
}

//二. get 邀请码
export async function getInvitation_code() {
  try {
    // 利用 thenFs 读取文件内容
    const str = await thenFs.readFile(contenturl, 'utf-8') // 返回的是Promise
    // 把str转换为数组
    const arr = JSON.parse(str)
    // 返回数组, 将来别人调用这个函数，就可以获取数组了
    return arr
  } catch (e) {
    return '获取卡号列表失败'
  }
}

//二. post 邀请码
export async function addInvitation_code(obj) {
  // 先读取文件中的数据
  const arr = await getInvitation_code()

  // 添加当前时间
  obj.sim_time = new Intl.DateTimeFormat('en-US', {
    timeZone: 'Asia/Shanghai',
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    fractionalSecondDigits: 3
  }).format(new Date())

  const newObj = {}
  for (const key in obj) {
    if (key !== 'id') {
      newObj[key] = obj[key]
    }
  }

  newObj.id = arr[arr.length - 1].id * 1 + 1
  // 然后向数组中添加元素
  //   obj.id = arr[arr.length - 1].id * 1 + 1;
  arr.push(newObj)

  // 写入数据
  try {
    // 代码 thenFs.writeFile()之前最好写await，有阻塞功能;
    await thenFs.writeFile(contenturl, JSON.stringify(arr))
    return '添加成功'
  } catch (e) {
    return '添加失败'
  }
}

//一. sim 手机号 delete
export async function deleteInvitation_code(id) {
  // 先读取文件中的数据
  const arr = await getInvitation_code()
  // 过滤模拟删除功能
  const newArr = arr.filter(item => item.id != id)
  // 写入文件
  try {
    // 代码 thenFs.writeFile()之前最好写await，有阻塞功能;
    // 这里需要改 contenturl
    await thenFs.writeFile(contenturl, JSON.stringify(newArr))
    return '删除成功'
  } catch (e) {
    return '删除失败'
  }
}

// 三. 查询接口
export async function get_reportCard() {
  try {
    // 利用 thenFs 读取文件内容
    const str = await thenFs.readFile(reportCardurl, 'utf-8') // 返回的是Promise
    // 把str转换为数组
    const arr = JSON.parse(str)
    // 返回数组, 将来别人调用这个函数，就可以获取数组了
    return arr
  } catch (e) {
    return '获取成绩单失败'
  }
}

// 默认导出
export default {
  getData,
  addData,
  delData,
  putData,
  getInvitation_code,
  addInvitation_code,
  deleteInvitation_code,
  get_reportCard
}
